package juego;

import java.io.Serializable;
import java.util.ArrayList;

import tablero.Posicion;
import tablero.Tablero;
import titiritero.vista.Dibujable;
import titiritero.vista.VistaBuqueHorizontal;
import titiritero.vista.VistaDestructorHorizontal;
import titiritero.vista.VistaDestructorVertical;
import titiritero.vista.VistaLanchaHorizontal;
import titiritero.vista.VistaLanchaVertical;
import titiritero.vista.VistaPortaavionesVertical;
import titiritero.vista.VistaRompehielosHorizontal;
import ataques.Atacador;
import ataques.Disparo;
import ataques.Mina;
import barco.Buque;
import barco.Destructor;
import barco.Direccion;
import barco.Lancha;
import barco.Portaaviones;
import barco.Rompehielos;

public class Juego implements Serializable {

    private static final long serialVersionUID = -826578423858086735L;
    private Jugador jugador;
    private Tablero tablero;
    private int cantidadTurnos;
    private static final int PUNTOSTURNO = 10;
    private static final int PUNTOSPARAGANAR = 5000;

    public Juego() {
        jugador = new Jugador();
        tablero = new Tablero();
        cantidadTurnos = 0;
    }

    public void setUp() {
        Tablero tablero = getTablero();
        Lancha lancha1 = new Lancha(Direccion.ABAJO);
        tablero.colocarBarcoHorizontal(new Posicion(1, 1), lancha1);
        tablero.addVista(new VistaLanchaHorizontal(lancha1));

        Lancha lancha2 = new Lancha(Direccion.ABAJODERECHA);
        tablero.colocarBarcoVertical(new Posicion(7, 4), lancha2);
        tablero.addVista(new VistaLanchaVertical(lancha2));

        Destructor destructor1 = new Destructor(Direccion.IZQUIERDA);
        tablero.colocarBarcoHorizontal(new Posicion(10, 5), destructor1);
        tablero.addVista(new VistaDestructorHorizontal(destructor1));

        Destructor destructor2 = new Destructor(Direccion.ARRIBADERECHA);
        tablero.colocarBarcoVertical(new Posicion(5, 5), destructor2);
        tablero.addVista(new VistaDestructorVertical(destructor2));

        Buque buque = new Buque(Direccion.DERECHA);
        tablero.colocarBarcoHorizontal(new Posicion(4, 3), buque);
        tablero.addVista(new VistaBuqueHorizontal(buque));

        Portaaviones portaaviones = new Portaaviones(Direccion.ARRIBA);
        tablero.colocarBarcoVertical(new Posicion(3, 9), portaaviones);
        tablero.addVista(new VistaPortaavionesVertical(portaaviones));

        Rompehielos rompehielos = new Rompehielos(Direccion.ABAJOIZQUIERDA);
        tablero.colocarBarcoHorizontal(new Posicion(5, 6), rompehielos);
        tablero.addVista(new VistaRompehielosHorizontal(rompehielos));

    }

    public int getPuntos() {
        return jugador.getPuntos();
    }

    public int cantidadBarcos() {
        return tablero.cantidadBarcos();
    }

    public ArrayList<Dibujable> getVistasBarcos() {
        return tablero.getVistasBarcos();
    }

    public void disparar(Disparo disparo) {
        tablero.getCasillero(disparo.getPosicion()).recibirDisparo(disparo);
        jugador.restarPuntos(disparo.getCosto());
    }

    public void lanzarMina(Mina mina) {
        tablero.getCasillero(mina.getPosicion()).recibirMina(mina);
        jugador.restarPuntos(mina.getCosto());
    }

    public void lanzarAtaque(Atacador ataque) {
        ataque.lanzar(this);
    }

    public void pasarTurno() {
        tablero.actualizarMinas();
        tablero.moverBarcos();
        jugador.restarPuntos(PUNTOSTURNO);
        cantidadTurnos++;

    }

    public int getCantidadTurnos() {
        return cantidadTurnos;
    }

    public Tablero getTablero() {
        return tablero;
    }

    public boolean juegoGanado() {
        return ((getPuntos() > PUNTOSPARAGANAR) && (tablero.cantidadBarcos() == 0));
    }

}
